#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
文件工具模块
提供文件管理相关工具函数，包括临时文件清理等
"""

import os
import shutil
import time
import glob
from pathlib import Path

def clean_temp_files(temp_dir, max_age_hours=24):
    """
    清理临时文件夹中的文件
    
    参数:
        temp_dir: 临时文件夹路径
        max_age_hours: 文件最大保留时间（小时），超过此时间的文件将被删除
    """
    if not os.path.exists(temp_dir):
        print(f"临时文件夹 {temp_dir} 不存在")
        return
    
    # 获取当前时间
    current_time = time.time()
    max_age_seconds = max_age_hours * 3600
    
    # 统计信息
    total_files = 0
    deleted_files = 0
    total_size = 0
    freed_size = 0
    
    print(f"正在清理临时文件夹: {temp_dir}")
    print(f"将删除超过 {max_age_hours} 小时的文件")
    
    # 获取所有文件
    for file_path in glob.glob(os.path.join(temp_dir, '*')):
        if os.path.isfile(file_path):
            total_files += 1
            file_size = os.path.getsize(file_path)
            total_size += file_size
            
            # 获取文件修改时间
            mod_time = os.path.getmtime(file_path)
            age_seconds = current_time - mod_time
            
            # 如果文件超过最大保留时间，删除它
            if age_seconds > max_age_seconds:
                try:
                    os.remove(file_path)
                    deleted_files += 1
                    freed_size += file_size
                    print(f"  删除: {os.path.basename(file_path)} (已保存 {age_seconds/3600:.1f} 小时)")
                except Exception as e:
                    print(f"  无法删除 {file_path}: {e}")
    
    # 打印统计信息
    if total_files > 0:
        print(f"\n清理完成:")
        print(f"  总文件数: {total_files}")
        print(f"  已删除: {deleted_files}")
        print(f"  总大小: {format_size(total_size)}")
        print(f"  释放空间: {format_size(freed_size)}")
    else:
        print("临时文件夹为空")

def format_size(size_bytes):
    """
    格式化文件大小显示
    
    参数:
        size_bytes: 文件大小（字节）
    
    返回:
        格式化后的大小字符串，如 "1.23 MB"
    """
    if size_bytes < 1024:
        return f"{size_bytes} 字节"
    elif size_bytes < 1024 * 1024:
        return f"{size_bytes / 1024:.2f} KB"
    elif size_bytes < 1024 * 1024 * 1024:
        return f"{size_bytes / (1024 * 1024):.2f} MB"
    else:
        return f"{size_bytes / (1024 * 1024 * 1024):.2f} GB"

def ensure_dir(directory):
    """
    确保目录存在，如果不存在则创建
    
    参数:
        directory: 目录路径
    """
    if not os.path.exists(directory):
        os.makedirs(directory)
        print(f"创建目录: {directory}")

def create_index_file(directory, file_type='html'):
    """
    为指定目录创建索引文件
    
    参数:
        directory: 目录路径
        file_type: 索引文件类型，可选 'html' 或 'txt'
    """
    if not os.path.exists(directory):
        print(f"目录 {directory} 不存在")
        return
    
    files = []
    for ext in ['*.jpg', '*.jpeg', '*.png', '*.mp4', '*.avi']:
        files.extend(glob.glob(os.path.join(directory, ext)))
    
    if not files:
        print(f"目录 {directory} 中没有找到媒体文件")
        return
    
    # 按修改时间排序，最新的在前面
    files.sort(key=os.path.getmtime, reverse=True)
    
    if file_type == 'html':
        # 创建HTML索引
        index_path = os.path.join(directory, 'index.html')
        with open(index_path, 'w', encoding='utf-8') as f:
            f.write('<!DOCTYPE html>\n')
            f.write('<html>\n')
            f.write('<head>\n')
            f.write('  <meta charset="utf-8">\n')
            f.write('  <title>YOLOv8检测结果索引</title>\n')
            f.write('  <style>\n')
            f.write('    body { font-family: Arial, sans-serif; margin: 20px; }\n')
            f.write('    .gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px; }\n')
            f.write('    .item { border: 1px solid #ddd; padding: 10px; border-radius: 5px; }\n')
            f.write('    .item img, .item video { width: 100%; height: auto; }\n')
            f.write('    .item p { margin: 5px 0; }\n')
            f.write('  </style>\n')
            f.write('</head>\n')
            f.write('<body>\n')
            f.write('  <h1>YOLOv8检测结果</h1>\n')
            f.write('  <div class="gallery">\n')
            
            for file_path in files:
                file_name = os.path.basename(file_path)
                file_size = format_size(os.path.getsize(file_path))
                mod_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(file_path)))
                
                f.write('    <div class="item">\n')
                
                # 根据文件类型决定显示图片还是视频
                if file_path.lower().endswith(('.mp4', '.avi')):
                    f.write(f'      <video controls><source src="{file_name}" type="video/mp4"></video>\n')
                else:
                    f.write(f'      <img src="{file_name}" alt="{file_name}">\n')
                
                f.write(f'      <p><a href="{file_name}" target="_blank">{file_name}</a></p>\n')
                f.write(f'      <p>大小: {file_size}</p>\n')
                f.write(f'      <p>日期: {mod_time}</p>\n')
                f.write('    </div>\n')
            
            f.write('  </div>\n')
            f.write('</body>\n')
            f.write('</html>\n')
        
        print(f"已创建HTML索引: {index_path}")
    
    elif file_type == 'txt':
        # 创建文本索引
        index_path = os.path.join(directory, 'index.txt')
        with open(index_path, 'w', encoding='utf-8') as f:
            f.write(f"YOLOv8检测结果索引 - {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"目录: {directory}\n")
            f.write("-" * 60 + "\n\n")
            
            for i, file_path in enumerate(files):
                file_name = os.path.basename(file_path)
                file_size = format_size(os.path.getsize(file_path))
                mod_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(file_path)))
                
                f.write(f"{i+1}. {file_name}\n")
                f.write(f"   大小: {file_size}\n")
                f.write(f"   日期: {mod_time}\n\n")
        
        print(f"已创建文本索引: {index_path}")
    
    else:
        print(f"不支持的索引文件类型: {file_type}") 